#ifndef SERIALPORTMANAGER_H
#define SERIALPORTMANAGER_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>
#include <QStringList>

/**
 * @brief 串口管理器类
 * 
 * 该类负责管理串口连接、数据接收和发送
 * 提供串口设备枚举、连接管理等功能
 */
class SerialPortManager : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QStringList availablePorts READ availablePorts NOTIFY availablePortsChanged)
    Q_PROPERTY(bool isConnected READ isConnected NOTIFY connectionStatusChanged)
    Q_PROPERTY(QString currentPort READ currentPort NOTIFY currentPortChanged)
    Q_PROPERTY(int baudRate READ baudRate WRITE setBaudRate NOTIFY baudRateChanged)

public:
    explicit SerialPortManager(QObject *parent = nullptr);
    ~SerialPortManager();

    /**
     * @brief 获取可用串口列表
     * @return 串口名称列表
     */
    QStringList availablePorts() const;

    /**
     * @brief 检查是否已连接
     * @return 连接状态
     */
    bool isConnected() const;

    /**
     * @brief 获取当前串口名称
     * @return 当前串口名称
     */
    QString currentPort() const;

    /**
     * @brief 获取波特率
     * @return 当前波特率
     */
    int baudRate() const;

    /**
     * @brief 设置波特率
     * @param rate 波特率值
     */
    void setBaudRate(int rate);

public slots:
    /**
     * @brief 连接到指定串口
     * @param portName 串口名称
     * @param baudRate 波特率 (默认9600)
     * @return 连接是否成功
     */
    bool connectToPort(const QString &portName, int baudRate = 9600);

    /**
     * @brief 断开串口连接
     */
    void disconnectPort();

    /**
     * @brief 刷新可用串口列表
     */
    void refreshPorts();

    /**
     * @brief 发送数据到串口
     * @param data 要发送的数据
     * @return 发送的字节数
     */
    qint64 sendData(const QByteArray &data);

signals:
    /**
     * @brief 接收到数据信号
     * @param data 接收到的数据
     */
    void dataReceived(const QByteArray &data);

    /**
     * @brief 接收到完整行数据信号
     * @param line 完整的数据行
     */
    void lineReceived(const QString &line);

    /**
     * @brief 连接状态改变信号
     * @param connected 是否已连接
     */
    void connectionStatusChanged(bool connected);

    /**
     * @brief 可用串口列表改变信号
     */
    void availablePortsChanged();

    /**
     * @brief 当前串口改变信号
     * @param portName 新的串口名称
     */
    void currentPortChanged(const QString &portName);

    /**
     * @brief 波特率改变信号
     * @param rate 新的波特率
     */
    void baudRateChanged(int rate);

    /**
     * @brief 错误信号
     * @param error 错误信息
     */
    void errorOccurred(const QString &error);

private slots:
    /**
     * @brief 处理串口数据接收
     */
    void handleReadyRead();

    /**
     * @brief 处理串口错误
     * @param error 串口错误类型
     */
    void handleSerialError(QSerialPort::SerialPortError error);

    /**
     * @brief 定时刷新串口列表
     */
    void onRefreshTimer();

private:
    QSerialPort *m_serialPort;          // 串口对象
    QTimer *m_refreshTimer;             // 刷新定时器
    QStringList m_availablePorts;       // 可用串口列表
    QByteArray m_receiveBuffer;         // 接收缓冲区
    QString m_currentPort;              // 当前串口名称
    int m_baudRate;                     // 波特率

    /**
     * @brief 更新可用串口列表
     */
    void updateAvailablePorts();

    /**
     * @brief 处理接收缓冲区中的数据
     */
    void processReceiveBuffer();
};

#endif // SERIALPORTMANAGER_H